/*
 * Beca.h
 *
 *  Created on: Nov 7, 2012
 *      Author: Carlos Alegría
 */

#ifndef BECA_H_
#define BECA_H_

#include <string>
#include <iostream>

using namespace std;

/**
 * Namespace para el código del curso
 */
namespace poo
{

  /**
   * Constantes que indican el nivel de estudios en una Beca
   */
  enum NivelDeEstudios
  {
    LICENCIATURA, /**< Nivel de estudios de Licenciatura */
    MAESTRIA, /**< Nivel de estudios de Maestría */
    DOCTORADO /**< Nivel de estudios de Doctorado */
  };

  ostream &
  operator<<(ostream &, NivelDeEstudios);

  /**
   * Una Beca estudiantil
   */
  class Beca
  {

    friend ostream &
    operator<<(ostream &, const Beca *);

  public:

    /**
     * Crea una Beca con los parámetros especificados
     *
     * @param [in] nombre       El nombre de la beca
     * @param [in] institucion  El nombre de la institución que proporciona la
     *                          beca
     * @param [in] nivel        El nivel de estudios para el cual se otorga la
     *                          beca
     */
    Beca(const string &nombre, const string &institucion,
        NivelDeEstudios nivel);

    /**
     * Destructor de la clase
     */
    virtual
    ~Beca();

    /**
     * Obtiene el nombre de la institución que otorga esta beca
     *
     * @returns Una cadena que contiene el nombre de la institución que otorga
     *          esta beca
     */
    const string&
    getInstitucion() const
    {
      return institucion;
    }

    /**
     * Obtiene el nivel de estudios para el cual se otorga esta beca
     *
     * @returns La constante de NivelDeEstudios que indica el nivel de estudios
     *          para el cual se otorga esta beca
     */
    NivelDeEstudios
    getNivel() const
    {
      return nivel;
    }

    /**
     * Obtiene el nombre de esta beca
     *
     * @returns Una cadena que indica el nombre de esta beca
     */
    const string&
    getNombre() const
    {
      return nombre;
    }

    /**
     * Calcula la cantidad de dinero que será otorgada por la Beca según el
     * promedio especificado
     *
     * @param [in] promedio     El promedio que obtuvo el estudiante al que se
     *                          le otorgó la beca
     * @returns la cantidad de dinero que será otorgada por esta Beca
     */
    virtual float
    calcularCantidad(float promedio) = 0;

  protected:

    string nombre; /**< El nombre de la beca */
    string institucion; /**< El nombre de la institución que proporciona esta beca */
    NivelDeEstudios nivel; /**< El nivel de estudios para el cual se otorga esta beca */
  };

} /* namespace poo */
#endif /* BECA_H_ */
